#include "BlockingQueue.hpp"
#include "task.hpp"
#include <vector>


//消费者生产者模型中，具体用于消费生产的数据并不是固定的，类型可以多样化选择
BlockingQueue<func_t> bq(4);
void* consumer(void* arg)
{
    func_t res;
    bq.Pop(&res);
    res();
    return nullptr;
}

void* productor(void* arg)
{
    func_t* ptr = static_cast<func_t*>(arg);
    bq.Push(*ptr);
    return nullptr;
}

int main()
{
    std::vector<func_t> task = {Print,Log,Flush,Cal};
    std::vector<pthread_t> p(4);
    std::vector<pthread_t> c(4);

    for(int i = 0;i < 4;i++)
        pthread_create(&c[i],nullptr,consumer,nullptr);
    for(int i = 0;i < 4;i++)
        pthread_create(&p[i],nullptr,productor,&task[i]);
    
    for(int i = 0;i < 4;i++)
    {
        pthread_join(p[i],nullptr);
        pthread_join(c[i],nullptr);
    }
    return 0;
}